iOS网络数据 - 异步加载

NSURLConnection

iOS 异步加载网络数据主要使用的 API 是 sendAsynchronousRequest,它是一个类型方法,使用方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let url = NSURL(string: "http://www.jikexueyuan.com")
let request = NSURLRequest(URL: url!)
let queue = NSOperationQueue()
NSURLConnection.sendAsynchronousRequest(request, queue: queue) { (resp: NSURLResponse?, data: NSData?, error: NSError?) in
if error != nil {
print("出错了")
}
else {
print(resp)
print(data)
}
}

在这里,sendAsynchronousRequest 的几个传入值的意义如下:

形参名 作用 传入值
request 网络请求的具体链接 NSURLRequest实例
queue 新建队列 NSOperationQueue实例
handler 请求完成的通知 函数

其中 handler 是一个尾随闭包,它的使用方法如下:

形参名 作用 传入值
NSURLResponse? 网络请求返回的HTTP协议头 和当前类型一致的属性
NSData? 网络请求返回的数据 和当前类型一致的属性
NSError? 网络请求可能发生的错误 和当前类型一致的属性

NSURLSession

值得注意的是,iOS9 以后,NSURLConnection 通讯方式全面被 NSURLSession 取代,因此上面的方法在 iOS9 以上的版本中会有提醒,NSURLConnection 的使用方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let url = NSURL(string: "http://www.jikexueyuan.com")
let request = NSURLRequest(URL: url!)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { (data: NSData?, resp: NSURLResponse?, error: NSError?) in
if error != nil {
print("出错了")
}
else {
print(resp)
print(data)
}
}
task.resume()

它的形参和 sendAsynchronousRequest 基本一致,在此就不再赘述,NSURLSession 默认具有开线程的能力,所以也就不需要 NSOperationQueue 实例了。